#ifndef DONSEE_32__H_
#define DONSEE_32__H_


//状态码
#define IFD_OK 0			   //执行成功
#define IFD_ICC_TypeError -1   //卡片类型不对
#define IFD_ICC_NoExist -2	   //无卡
#define IFD_ICC_NoPower -3	   //有卡未上电
#define IFD_ICC_NoResponse -4  //卡片无应答
#define IFD_ConnectError -11   //读卡器连接错
#define IFD_UnConnected -12	   //未建立连接(没有执行打开设备函数)
#define IFD_BadCommand -13	   //(动态库)不支持该命令
#define IFD_ParameterError -14 //(发给动态库的)命令参数错
#define IFD_CheckSumError -15  //信息校验和出错
#define IFD_OutTime -20		   //信息校验和出错
#define IFD_False -21		   //命令执行失败
#define IFD_READCARD_FALSE -23 //命令执行失败


#ifdef __cplusplus
extern "C"
{
#endif
	//读卡器句柄：ReaderHandle

	long Donsee_Open(char *szDevName);
	long Donsee_Beep();
	long Donsee_Close();
	long Donsee_Version(unsigned char *pszVersion);
	long Donsee_WRSerial(int nType, unsigned char *pszSerial);
	long Donsee_ChipSerial(char *pszChipSerial); //获取芯片序列号，即终端设备号

	/*############接触CPU卡操作#################*/
	/*
		大卡座:0x01
		SAM1:0x11
		SAM2:0x12
		SAM3:0x13
		SAM4:0x14

	*/
	long Donsee_PowerOn(int nSlotNo, char *pszATR);		//
	long Donsee_ColdPowerOn(int nSlotNo, char *pszATR); //
	long Donsee_HotPowerOn(int nSlotNo, char *pszATR);	//
	long Donsee_PowerOff(int nSlotNo);					//
	long Donsee_GetStatus(int nSlotNo, int *nStatus);	//
	long Donsee_APDU(int nSlotNo, char *szAPDUCmd, char *pszAPDUResult);

	/*############非接基本操作函数#################*/
	long Donsee_ICSelect(unsigned char cardType); //选择卡片，41为typea,M1 42为typeb,TypeB卡片需先上电后选卡
	long Donsee_ICRequest();					  // typea M1请求卡片
	long Donsee_SwitchRF(int nFlag);			  // flag=0 关闭天线 flag=1 打开天线
	long Donsee_ICAnticoll(char *pszUID);		  //防碰撞 typea M1卡片
	/*############ TypeA CPU | TypeB CPU卡操作函数 #################*/
	long Donsee_SetTypeA();					//设置读typeA
	long Donsee_SetTypeB();					//设置读typeB
	long Donsee_PowerOnTypeA(char *pszAtr); //
	long Donsee_PowerOnTypeB(char *pszAtr); //
	long Donsee_APDUType(char *szAPDUCmd, char *pszAPDUResult);

	typedef struct
	{
		char name[40];		   /*姓名*/
		char sex[10];		   /*性别*/
		char nation[20];	   /*民族*/
		char birthday[50];	   /*出生日期（YYYYMMDD）*/
		char signdate[50];	   /*发证日期（YYYYMMDD）*/
		char validterm[50];	   /*有效日期（YYYYMMDD）*/
		char cardnumber[40];   /*卡号*/
		char idnumber[40];	   /*社会保障号码(身份证号)*/
		char city[64];		   /*城市代码*/
		char cardveVrsion[8];  /*社保卡版本*/
		char identityCode[64]; /*卡识别码*/
		char szTerminalNo[32]; /*SAM卡识别号*/
		char Other[200];	   /*其他*/
	} SSCard_IDINFO;

	// nReadType 读卡方式 0x11 PSAM1 0x12 PSAM2 0x13 PSAM3 0x14 PSAM4
	long Donsee_ReadSSCard(int nSlotPsam, SSCard_IDINFO *cardInfo, char *arrChMsg);
	long Donsee_iReadCardBas(int iType, char *pOutInfo);
	long Donsee_iReadCardBas_HSM_Step1(int iType, char *pOutInfo);
	long Donsee_iReadCardBas_HSM_Step2(char *pKey, char *pOutInfo);
	long Donsee_getTerminalNo(unsigned char nSlotNo, char *szTerminalNo); //获取社保加密PSAM卡卡号，即终端机编号

	//############################### 读身份证 ############################################################

	typedef struct
	{
		char name[120];			   /*中文姓名*/
		char ENfullname[420];	   /*英文姓名*/
		char ENfullnameOther[120]; /*英文姓名备用*/
		char sex[12];			   /*性别*/
		char people[30];		   /*民族*/
		char address[240];		   /*地址*/
		char birthday[60];		   /*出生日期（YYYYMMDD）*/
		char signdate[60];		   /*发证日期（YYYYMMDD）*/
		char validterm[60];		   /*有效日期（YYYYMMDD）*/
		char number[150];		   /*证件号码*/
		char organs[150];		   /*发证机关(或外国人永久居住证-当次申请受理机关)*/
		char Nationality[60];	   /*国籍*/
		char Photo[2560];		   /*读取二代证电子信息时保存照片数据信息*/
		char Other[200];		   /*其他*/
		char passNu[75];		   /*通行证号*/
		char signCount[24];		   /*签发数次*/
		char certVersion[24];	   /*证件版本*/
		char certType[18];		   /*卡片类型："0" 居民身份证, "I" 2017版外国人永居证, "Y" 2023新版外国人永居证, "J" 港澳台居民居住证*/
		char changCount[18];	   /*换证次数*/
		char oldNumber[60];		   /*既往版本永居证号码*/
		char figData[2560];		   /*指纹信息*/
	} IDINFO;

	long Donsee_ReadSAMID(char *pszSAMID);	 //获取SAMID
	long Donsee_ReadIDCardUid(char *pszUID); //读身份证ID
	long Donsee_ReadIDCard(int nType, int nMode, char *szPath, IDINFO *idInfo, char *pszMsg);

	////////////////////////////////////////////////////
	/*############ M1卡操作函数#################*/
	// long Donsee_ReadICUid (char* pszUID);//读取M1和CPU卡UID
	long Donsee_M1VerifyPass(unsigned char nMode, unsigned char nSecNr, char *szPassKey);			  //认证密钥M1 带密钥参数
	long Donsee_M1VerifyPassHex(unsigned char nMode, unsigned char nSecNr, unsigned char *szPassKey); //认证密钥M1 带密钥参数
	long Donsee_M1Read(unsigned char nAddr, char *pszData);											  //读卡
	long Donsee_M1Write(unsigned char nAddr, char *szData);											  //写卡
	long Donsee_M1Initval(unsigned char nAddr, unsigned long nValue);								  //初始化值
	long Donsee_M1Increment(unsigned char nAddr, unsigned long nValue);								  //增值
	long Donsee_M1Decrement(unsigned char nAddr, unsigned long nValue);								  //减值M1
	long Donsee_M1Readval(unsigned char nAddr, unsigned long *nValue);								  //读值M1
	long Donsee_M1LoadKey(unsigned char nMode, unsigned char nSecNr, char *szKey);					  //装载密钥
	long Donsee_M1Verify(unsigned char nMode, unsigned char nSecNr);
	/*############ 15693 卡操作函数#################*/
	long Donsee_15693_Find(char *pszUID);						   //用于得到卡的详细信息
	long Donsee_15693_Info(char *pszCardInfo);					   //用于得到卡的详细信息
	long Donsee_15693_Read(unsigned char nBlkAdd, char *pszValue); //用来读取1个扇区的值
	long Donsee_15693_Write(unsigned char nBlkAdd, char *szData);  //对一个块进行写操作（每次只能写一个块）
	long Donsee_15693_WriteAFI(unsigned char szValue, char *pszValue);
	long Donsee_15693_LockAFI(char *pszValue);
	long Donsee_15693_WriteDSFID(unsigned char szValue, char *pszValue);
	long Donsee_15693_LockDSFID(char *pszValue);
	long Donsee_15693_LockDataBlock(unsigned char nBlkAdd, char *pszValue);
	/*############ 4442基本操作函数#################*/
	long Donsee_4442_PowerOn(char *pszUID);								 // 4442卡上电 返回数据长度
	long Donsee_4442_PowerOff();										 // 4442卡下电
	long Donsee_4442_Read(int nOffset, int nLen, char *pszData);		 // 4442卡读数据
	long Donsee_4442_Write(int nOffset, int nLen, char *szData);		 // 4442卡写数据
	long Donsee_4442_Verify(char *szKey);								 // 4442卡认证密钥
	long Donsee_4442_Change(char *szNewkey);							 // 4442卡修改密钥
	long Donsee_4442_ReadProtect(int nOffset, int nLen, char *pszData);	 // 4442卡读保护数据
	long Donsee_4442_WriteProtect(int nOffset, int nLen, char *pszData); // 4442卡写保护数据
	long Donsee_4442_ReadCount(int *nCount);							 //读取4442卡密钥剩余认证次数 返回次数0~3次

	//################################磁条卡操作################################################################
	long Donsee_ReadMagCard(unsigned char nTime, int nTrack, char *pszTrackData); //读磁条卡
	long Donsee_ReadMagType(int nMode, unsigned char *szConfig);				  //设置磁条输出模式
	//################################北京通################################################################

	typedef struct
	{
		char name[40];		 /*姓名*/
		char sex[10];		 /*性别*/
		char cardnumber[40]; /*北京通号*/
		char nType[32];		 /*卡片类型*/
		char cardName[40];	 /*证件名称*/
		char organs[50];	 /*发卡机构*/
	} BJT_IDINFO;

	long Donsee_ReadBJTIDCard(BJT_IDINFO *cardInfo, char *arrChMsg);
	long Donsee_ReadBJTIDCard_Photo(char *cardInfoPhoto, char *arrChMsg);

	long Donsee_GetBankCardNo(char *pszBankCardNo); //银行卡卡号

#ifdef __cplusplus
}
#endif

#endif
